# 获取Excel表格内容，需要导入包openpyxl
import sys

import openpyxl


class HandleExcel:
    base_path = '/Users/fanchao/Downloads/url.xlsx'

    def load_excel(self):
        """
        加载excel
        """
        open_excel = openpyxl.load_workbook(self.base_path)
        return open_excel

    def get_sheet_data(self, index=None):
        """
        加载所有sheet的内容
        """
        sheet_name = self.load_excel().sheetnames
        if index is None:
            index = 0
        data = self.load_excel()[sheet_name[index]]
        return data

    def get_cell_value(self, row, cols):
        """
        获取某一个单元格内容
        """
        data = self.get_sheet_data().cell(row, cols).value
        return data

    def get_rows(self):
        """
        获取总行数
        """
        row = self.get_sheet_data().max_row
        return row

    def get_rows_value(self, row):
        """
        获取某一行的全部内容
        """
        rows_list = []
        # 获取某一个行的全部对象，循环取值后加入空集合中
        for i in self.get_sheet_data()[row]:
            rows_list.append(i.value)
        return rows_list

    def excel_write_data(self, row, cols, value):
        """
        写入数据
        """
        wb = self.load_excel()
        wr = wb.active
        wr.cell(row, cols, value)
        wb.save(self.base_path)  # 记得保存

    def get_columns_value(self, key=None):
        """
        获取某一列的数据
        :param key:列
        :return:返回这一列的所有数据
        """
        if key is None:  # 给个默认值
            key = "A"
        columns_list = []  # 定义空列表
        columns_list_data = self.get_sheet_data()[key]  # 获取某一列的对象
        for i in columns_list_data:  # 将对象循环添加至空列表中
            columns_list.append(i.value)
        return columns_list

    def get_rows_number(self, case_id, col_key=None):
        """
        根据某个数据，获取他的行号
        :param col_key: 哪一列
        :param case_id: 这一列的某一个数据
        :return: 返回它的行号
        """
        num = 1
        cols_data = self.get_columns_value(col_key)  # 获取到这一列的全部数据
        for col_data in cols_data:  # 从第一行开始，循环判断，定位到数据在哪一行，并返回行号
            if case_id == col_data:
                return num
            num = num + 1
        return num

    def get_excel_data(self):
        """
        获取excel数据。列表套列表类型
        :return:
        """
        data_list = []
        for i in range(self.get_rows()):
            data_list.append(self.get_rows_value(i + 2))
        return data_list

    def get_excel_data_list_dict(self):
        """
        获取excel数据。列表套字典类型
        :return:
        """
        data_list = []  # 定义空列表，将读取出来的excel数据存入列表
        for i in range(self.get_rows()):
            data_list.append(self.get_rows_value(i + 2))
        # 定义字典的key值
        # function
        data_key = ['case_id', 'case_title', 'is_run', 'condition', 'depend_key', 'url', 'method', 'request_data',
                    'cookie', 'header', 'expect_method', 'expect', 'result', 'result_data']
        data_list1 = []  # 定义空列表，将处理好的字典存入列表
        for i in data_list:
            # 不知道为什么，excel中最后几行没有数据，但是也会被读出来，目前总共需要14个参数，一大半None，基本就属于垃圾数据了，直接跳过它们
            if i.count(None) < 10:
                number = 0
                data_dict = {}
                # print(i)
                for j in i:
                    # print(number)
                    data_dict[data_key[number]] = j
                    number = number + 1
                data_list1.append(data_dict)
        return data_list1

    def excel_write_result_and_data(self, row, result, data):
        """
        在用例中写入测试结果和数据（接口返回值）
        :param row: 行号
        :param result: 测试结果
        :param data: 接口返回值
        :return:
        """
        self.excel_write_data(row, 13, result)  # 在用例中写入执行结果
        if data is not None:
            self.excel_write_data(row, 14, data)  # 在用例中写入数据
        else:
            self.excel_write_data(row, 14, '')  # 在用例中写入数据


excel_data = HandleExcel()  # 实例化，其他类调它可用
# 当我们的模块被单独运行时，执行的一些操作，此模块被导入别的模块时，不执行以下内容，常用来测试单模块模块是否可行
if __name__ == "__main__":
    handle_excel = HandleExcel()
    print(handle_excel.get_cell_value(2, 2))
    print(handle_excel.get_rows())
    print(handle_excel.get_rows_value(1))
    # handle_excel.excel_write_data(2, 12, '通过')      # 如果报错没有权限，关闭打开的excel文件即可
    print(handle_excel.get_columns_value("c"))
    print(handle_excel.get_rows_number("/HotSearch", 'e'))
    print(handle_excel.get_excel_data())
